Fix PAL_PTCE_INFO and cpuid (pfmon now works)
authordjm@kirby.fc.hp.com <djm@kirby.fc.hp.com>
Wed, 13 Jul 2005 20:12:00 +0000 (13:12 -0700)
committerdjm@kirby.fc.hp.com <djm@kirby.fc.hp.com>
Wed, 13 Jul 2005 20:12:00 +0000 (13:12 -0700)
xen/arch/ia64/dom_fw.c
xen/arch/ia64/vcpu.c

index 751f39c64f3a30564f813cc8a962ca9dea7577b8..160d5be4cc9f20c51bb83ab8fc368eef73d7cc88 100644 (file)
@@ -313,7 +313,14 @@ xen_pal_emulator(unsigned long index, unsigned long in1,
                status = ia64_pal_freq_ratios(&r9,&r10,&r11);
                break;
            case PAL_PTCE_INFO:
-               status = ia64_get_ptce(&r9);
+               {
+                       ia64_ptce_info_t ptce;
+                       status = ia64_get_ptce(&ptce);
+                       if (status != 0) break;
+                       r9 = ptce.base;
+                       r10 = (ptce.count[0]<<32)|(ptce.count[1]&0xffffffffL);
+                       r11 = (ptce.stride[0]<<32)|(ptce.stride[1]&0xffffffffL);
+               }
                break;
            case PAL_VERSION:
                status = ia64_pal_version(&r9,&r10);
@@ -340,18 +347,30 @@ xen_pal_emulator(unsigned long index, unsigned long in1,
                status = ia64_pal_register_info(in1,&r9,&r10);
                break;
            case PAL_CACHE_FLUSH:
-               return pal_emulator_static(index); /* FIXME */
+               /* FIXME */
+               printk("PAL_CACHE_FLUSH NOT IMPLEMENTED!\n");
+               BUG();
                break;
            case PAL_PERF_MON_INFO:
                {
                        unsigned long pm_buffer[16];
+                       int i;
                        status = ia64_pal_perf_mon_info(pm_buffer,&r9);
-                       if (status != 0) break;
+                       if (status != 0) {
+                               while(1)
+                               printk("PAL_PERF_MON_INFO fails ret=%d\n",status);
+                               break;
+                       }
                        if (copy_to_user((void __user *)in1,pm_buffer,128)) {
+                               while(1)
                                printk("xen_pal_emulator: PAL_PERF_MON_INFO "
                                        "can't copy to user!!!!\n");
                                status = -1;
+                               break;
                        }
+                       printk("PAL_PERF_MON_INFO succeeds! r9=%lx\n",r9);
+                       for (i=0; i<16;i++)
+                       printk("pm_buffer[i]=%lx\n",pm_buffer[i]);
                }
                break;
            case PAL_CACHE_INFO:
@@ -364,8 +383,10 @@ xen_pal_emulator(unsigned long index, unsigned long in1,
                }
                break;
            case PAL_VM_TR_READ:        /* FIXME: vcpu_get_tr?? */
+               printk("PAL_VM_TR_READ NOT IMPLEMENTED, IGNORED!\n");
                break;
            case PAL_HALT_INFO:         /* inappropriate info for guest? */
+               printk("PAL_HALT_INFO NOT IMPLEMENTED, IGNORED!\n");
                break;
            default:
                printk("xen_pal_emulator: UNIMPLEMENTED PAL CALL %d!!!!\n",
index 985422b112b84111919a8ab00ad5ae0cd838ce6b..c850c5fd653b33a844bcb3921cefe280811f9c52 100644 (file)
@@ -1499,20 +1499,24 @@ IA64FAULT vcpu_get_cpuid(VCPU *vcpu, UINT64 reg, UINT64 *pval)
        // if reg > 3
        switch(reg) {
            case 0:
-           case 1:
                memcpy(pval,"Xen/ia64",8);
                break;
+           case 1:
+               *pval = 0;
+               break;
            case 2:
                *pval = 0;
                break;
            case 3:
-               *pval = 0;  //FIXME: See vol1, 3.1.11
+               *pval = ia64_get_cpuid(3);
                break;
            case 4:
-               *pval = 1;  //FIXME: See vol1, 3.1.11
+               *pval = ia64_get_cpuid(4);
                break;
            default:
-               *pval = 0;  //FIXME: See vol1, 3.1.11
+               if (reg > (ia64_get_cpuid(3) & 0xff))
+                       return IA64_RSVDREG_FAULT;
+               *pval = ia64_get_cpuid(reg);
                break;
        }
        return (IA64_NO_FAULT);